home *** CD-ROM | disk | FTP | other *** search
/ Isometric Game Programming with DirectX 7.0 / Isometric Game Programming.iso / source / chapter13 / isohex13_1 / isohex13_1.cpp < prev    next >
C/C++ Source or Header  |  2000-07-15  |  8KB  |  290 lines

  1. /*****************************************************************************
  2. IsoHex13_1.cpp
  3. Ernest S. Pazera
  4. 15JUL2000
  5. Start a WIN32 Application Workspace, add in this file
  6. Requires ddraw.lib and dxguid.lib
  7. Needs DDFuncs.h/cpp, GDICanvas.h/cpp, and TileSet.h/cpp
  8. *****************************************************************************/
  9.  
  10. //////////////////////////////////////////////////////////////////////////////
  11. //INCLUDES
  12. //////////////////////////////////////////////////////////////////////////////
  13. #define WIN32_LEAN_AND_MEAN  
  14.  
  15. #include <windows.h>   
  16. #include "TileSet.h"
  17.  
  18. //////////////////////////////////////////////////////////////////////////////
  19. //DEFINES
  20. //////////////////////////////////////////////////////////////////////////////
  21. //name for our window class
  22. #define WINDOWCLASS "ISOHEX13"
  23. //title of the application
  24. #define WINDOWTITLE "IsoHex 13-1"
  25.  
  26. //map dimensions
  27. const int MAPWIDTH=8;
  28. const int MAPHEIGHT=20;
  29.  
  30. //////////////////////////////////////////////////////////////////////////////
  31. //PROTOTYPES
  32. //////////////////////////////////////////////////////////////////////////////
  33. bool Prog_Init();//game data initalizer
  34. void Prog_Loop();//main game loop
  35. void Prog_Done();//game clean up
  36. POINT StagMap_TilePlotter(POINT ptMap,int iTileWidth,int iTileHeight);
  37. void SetUpMap();
  38. void DrawMap();
  39.  
  40. //////////////////////////////////////////////////////////////////////////////
  41. //GLOBALS
  42. //////////////////////////////////////////////////////////////////////////////
  43. HINSTANCE hInstMain=NULL;//main application handle
  44. HWND hWndMain=NULL;//handle to our main window
  45. LPDIRECTDRAW7 lpdd=NULL;//directdraw
  46. LPDIRECTDRAWSURFACE7 lpddsMain=NULL;//primary surface
  47. LPDIRECTDRAWSURFACE7 lpddsBack=NULL;//back buffer
  48. LPDIRECTDRAWCLIPPER lpddClipper=NULL;//clipper
  49. CTileSet tsIso;//tileset
  50. int iTileMap[MAPWIDTH][MAPHEIGHT];
  51.  
  52. //////////////////////////////////////////////////////////////////////////////
  53. //WINDOWPROC
  54. //////////////////////////////////////////////////////////////////////////////
  55. LRESULT CALLBACK TheWindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
  56. {
  57.     //which message did we get?
  58.     switch(uMsg)
  59.     {
  60.     case WM_KEYDOWN:
  61.         {
  62.             //if escape hit, destroy window
  63.             if(wParam==VK_ESCAPE) DestroyWindow(hWndMain);
  64.             //handled, so return 0
  65.             return(0);
  66.         }break;
  67.     case WM_DESTROY://the window is being destroyed
  68.         {
  69.  
  70.             //tell the application we are quitting
  71.             PostQuitMessage(0);
  72.  
  73.             //handled message, so return 0
  74.             return(0);
  75.  
  76.         }break;
  77.     case WM_PAINT://the window needs repainting
  78.         {
  79.             //a variable needed for painting information
  80.             PAINTSTRUCT ps;
  81.             
  82.             //start painting
  83.             HDC hdc=BeginPaint(hwnd,&ps);
  84.  
  85.             /////////////////////////////
  86.             //painting code would go here
  87.             /////////////////////////////
  88.  
  89.             //end painting
  90.             EndPaint(hwnd,&ps);
  91.                         
  92.             //handled message, so return 0
  93.             return(0);
  94.         }break;
  95.     }
  96.  
  97.     //pass along any other message to default message handler
  98.     return(DefWindowProc(hwnd,uMsg,wParam,lParam));
  99. }
  100.  
  101.  
  102. //////////////////////////////////////////////////////////////////////////////
  103. //WINMAIN
  104. //////////////////////////////////////////////////////////////////////////////
  105. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
  106. {
  107.     //assign instance to global variable
  108.     hInstMain=hInstance;
  109.  
  110.     //create window class
  111.     WNDCLASSEX wcx;
  112.  
  113.     //set the size of the structure
  114.     wcx.cbSize=sizeof(WNDCLASSEX);
  115.  
  116.     //class style
  117.     wcx.style=CS_OWNDC | CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  118.  
  119.     //window procedure
  120.     wcx.lpfnWndProc=TheWindowProc;
  121.  
  122.     //class extra
  123.     wcx.cbClsExtra=0;
  124.  
  125.     //window extra
  126.     wcx.cbWndExtra=0;
  127.  
  128.     //application handle
  129.     wcx.hInstance=hInstMain;
  130.  
  131.     //icon
  132.     wcx.hIcon=LoadIcon(NULL,IDI_APPLICATION);
  133.  
  134.     //cursor
  135.     wcx.hCursor=LoadCursor(NULL,IDC_ARROW);
  136.  
  137.     //background color
  138.     wcx.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
  139.  
  140.     //menu
  141.     wcx.lpszMenuName=NULL;
  142.  
  143.     //class name
  144.     wcx.lpszClassName=WINDOWCLASS;
  145.  
  146.     //small icon
  147.     wcx.hIconSm=NULL;
  148.  
  149.     //register the window class, return 0 if not successful
  150.     if(!RegisterClassEx(&wcx)) return(0);
  151.  
  152.     //create main window
  153.     hWndMain=CreateWindowEx(0,WINDOWCLASS,WINDOWTITLE, WS_POPUP | WS_VISIBLE,0,0,320,240,NULL,NULL,hInstMain,NULL);
  154.  
  155.     //error check
  156.     if(!hWndMain) return(0);
  157.  
  158.     //if program initialization failed, then return with 0
  159.     if(!Prog_Init()) return(0);
  160.  
  161.     //message structure
  162.     MSG msg;
  163.  
  164.     //message pump
  165.     for(;;)    
  166.     {
  167.         //look for a message
  168.         if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
  169.         {
  170.             //there is a message
  171.  
  172.             //check that we arent quitting
  173.             if(msg.message==WM_QUIT) break;
  174.             
  175.             //translate message
  176.             TranslateMessage(&msg);
  177.  
  178.             //dispatch message
  179.             DispatchMessage(&msg);
  180.         }
  181.  
  182.         //run main game loop
  183.         Prog_Loop();
  184.     }
  185.     
  186.     //clean up program data
  187.     Prog_Done();
  188.  
  189.     //return the wparam from the WM_QUIT message
  190.     return(msg.wParam);
  191. }
  192.  
  193. //////////////////////////////////////////////////////////////////////////////
  194. //INITIALIZATION
  195. //////////////////////////////////////////////////////////////////////////////
  196. bool Prog_Init()
  197. {
  198.     //set up ddraw
  199.     lpdd=LPDD_Create(hWndMain,DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT);
  200.     lpdd->SetDisplayMode(640,480,16,0,0);
  201.  
  202.     //set up primary surface
  203.     lpddsMain=LPDDS_CreatePrimary(lpdd,1);
  204.  
  205.     //set up back buffer
  206.     lpddsBack=LPDDS_GetSecondary(lpddsMain);
  207.  
  208.     //create clipper
  209.     lpdd->CreateClipper(0,&lpddClipper,NULL);
  210.     lpddClipper->SetHWnd(0,hWndMain);
  211.     lpddsBack->SetClipper(lpddClipper);
  212.  
  213.     //load in tileset
  214.     tsIso.Load(lpdd,"IsoHex13_1.bmp");
  215.  
  216.     //set up the tilemap
  217.     SetUpMap();
  218.  
  219.     return(true);//return success
  220. }
  221.  
  222. //////////////////////////////////////////////////////////////////////////////
  223. //CLEANUP
  224. //////////////////////////////////////////////////////////////////////////////
  225. void Prog_Done()
  226. {
  227.     //clean up clipper
  228.     LPDDCLIP_Release(&lpddClipper);
  229.     //clean up primary surface
  230.     LPDDS_Release(&lpddsMain);
  231.     //clean up ddraw
  232.     LPDD_Release(&lpdd);
  233. }
  234.  
  235. //////////////////////////////////////////////////////////////////////////////
  236. //MAIN GAME LOOP
  237. //////////////////////////////////////////////////////////////////////////////
  238. void Prog_Loop()
  239. {
  240.     //show the board
  241.     DrawMap();
  242.     //flip
  243.     lpddsMain->Flip(NULL,DDFLIP_WAIT);
  244. }
  245.  
  246. POINT StagMap_TilePlotter(POINT ptMap,int iTileWidth,int iTileHeight)
  247. {
  248.     POINT ptReturn;
  249.     //calculate pixel position for the map position given
  250.     ptReturn.x=ptMap.x*iTileWidth+(ptMap.y & 1)*(iTileWidth/2);
  251.     ptReturn.y=ptMap.y*(iTileHeight/2);
  252.     //return calculate point
  253.     return(ptReturn);
  254. }
  255.  
  256. void SetUpMap()
  257. {
  258.     //randomly set up the map
  259.     for(int x=0;x<MAPWIDTH;x++)
  260.     {
  261.         for(int y=0;y<MAPHEIGHT;y++)
  262.         {
  263.             iTileMap[x][y]=rand()%(tsIso.GetTileCount());
  264.         }
  265.     }
  266. }
  267.  
  268. void DrawMap()
  269. {
  270.     POINT ptTile;//tile pixel coordinate
  271.     POINT ptMap;//map coordinate
  272.     //get tile width and height
  273.     int iTileWidth=tsIso.GetTileList()[0].rcSrc.right-tsIso.GetTileList()[0].rcSrc.left;
  274.     int iTileHeight=tsIso.GetTileList()[0].rcSrc.bottom-tsIso.GetTileList()[0].rcSrc.top;
  275.     //the y loop is outside, because we must blit in horizontal rows
  276.     for(int y=0;y<MAPHEIGHT;y++)
  277.     {
  278.         for(int x=0;x<MAPWIDTH;x++)
  279.         {
  280.             //get pixel coordinate for map position
  281.             ptMap.x=x;
  282.             ptMap.y=y;
  283.             ptTile=StagMap_TilePlotter(ptMap,iTileWidth,iTileHeight);
  284.             //plot the tile
  285.             tsIso.PutTile(lpddsBack,ptTile.x,ptTile.y,iTileMap[x][y]);
  286.         }
  287.     }
  288. }
  289.  
  290.